package com.tarena.micro.service.gateway.filters;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;
import java.util.function.Supplier;

//成为容器bean对象
//@Component
public class My01Filter implements GlobalFilter , Ordered {
    /**
     * @param exchange 交换机 包装了当前过滤器处理的请求和响应对象
     * @param chain 表示连接过滤链的对象
     * @return 是spring webflux框架的一个通用结构的返回对象,作为响应数据返回,和springmvc中的model类似
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("进入我的第一个过滤器");
        //1.拿到响应对象
        ServerHttpResponse response = exchange.getResponse();
        //2.直接拦截,在这个过滤器中将响应返回 准备一个字符串 反馈信息
        String jsonData="{\"state\":200,\"message\":\"你被拦截了\",\"data\":null}";
        //3.直接在响应中 使用中文有可能出现乱码,响应编码字符集和浏览器解码字符集一致
        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);//浏览器不同对于application/json
        //的响应头 解码字符集 不一定使用utf-8 比如 ie
        //4.将响应字符串 做封装,放到响应对象返回
        //4.1 将jsonData转化成二进制 字节数组 指定编码字符集 utf-8
        byte[] bytes = jsonData.getBytes(StandardCharsets.UTF_8);
        //4.2 将二进制字节数组 封装成缓冲流
        DataBuffer dataBuffer = response.bufferFactory().wrap(bytes);
        Mono<DataBuffer> monoResult=Mono.fromSupplier(new Supplier<DataBuffer>() {
            @Override
            public DataBuffer get() {
                //在这个方法中 将上述包装完的缓冲流返回
                return dataBuffer;
            }
        });
        return response.writeWith(monoResult);//让请求正常通过这个过滤器 进入后续流程
        //return response.writeWith(Mono.fromSupplier(()->{
            //return response.bufferFactory().wrap(jsonData.getBytes(StandardCharsets.UTF_8));
        //}));
    }

    @Override
    public int getOrder() {
        return 100;
    }
}
